#pragma once


#include "fxcc/core/graph/common/pch.h"
#include "fxcc/core/graph/common/GeometryData.h"

namespace fxcc
{
    namespace graph
    {
        namespace common
        {
            struct FXCC_API Geometry
            {
                static GeometryData CreateSphere(float radius = 1.0f, uint32_t levels = 20, uint32_t slices = 20);

                static GeometryData CreateBox(float width = 2.0f, float height = 2.0f, float depth = 2.0f);

                static GeometryData CreateCylinder(float radius = 1.0f, float height = 2.0f, uint32_t slices = 20, uint32_t stacks = 10, float texU = 1.0f, float texV = 1.0f);

                static GeometryData CreateCone(float radius = 1.0f, float height = 2.0f, uint32_t slices = 20);


                static GeometryData CreatePlane(const glm::vec2& planeSize, const glm::vec2& maxTexCoord = { 1.0f, 1.0f });

                static GeometryData CreatePlane(float width = 10.0f, float depth = 10.0f, float texU = 1.0f, float texV = 1.0f);

                static GeometryData CreateGrid(const glm::vec2& gridSize, const glm::ivec2& slices, const glm::vec2& maxTexCoord,
                    const std::function<float(float, float)>& heightFunc = [](float x, float z) { return 0.0f; },
                    const std::function<glm::vec3(float, float)>& normalFunc = [](float x, float z) { return glm::vec3(0.0f, 1.0f, 0.0f); },
                    const std::function<glm::vec4(float, float)>& colorFunc = [](float x, float z) { return glm::vec4(1.0f, 1.0f, 1.0f, 1.0f); });
                // Create quad
                static GeometryData CreateQuad();

                static GeometryData Create2DTexture();

                static GeometryData CreateQuad2();


            };
        };
    };
};
